#include "mainwidget.h"
#include "ui_mainwidget.h"
#include"customtablemodel.h"
#include"documenttypedelegate.h"
#include<QVBoxLayout >
#include <QHeaderView>
#include<QInputDialog>
#include<QMessageBox>
MainWidget::MainWidget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::MainWidget)
{
    ui->setupUi(this);
    initUi();     // 先画界面
    initModel();  // 再塞数据
    connectSignals();//连接信号与槽函数
    setWindowTitle("CustomTableDemo");
    resize(900, 500);
}

MainWidget::~MainWidget()
{
    delete ui;
}

void MainWidget::initUi()
{
    // 1. 模型
    m_model = new CustomTableModel(this);

    // 2. 表格
    m_tableView = new QTableView(this);
    //设置视图的模型
    m_tableView->setModel(m_model);
    qDebug() << "Model set to view, model row count:" << m_model->rowCount();  // 调试
    m_tableView->setAlternatingRowColors(true); // 隔行变色
    m_tableView->setSelectionBehavior(QAbstractItemView::SelectRows);



    //设置功能按钮
    m_btnAppendColumn = new QToolButton(this);
    m_btnAppendColumn->setText("追加列");
    m_btnAppendColumn->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
    m_btnAppendColumn->setIcon(style()->standardIcon(QStyle::SP_FileDialogNewFolder));

    m_btnRemoveColumn = new QToolButton(this);
    m_btnRemoveColumn->setText("删除列");
    m_btnRemoveColumn->setIcon(style()->standardIcon(QStyle::SP_DialogDiscardButton));

    m_btnAppendRow = new QToolButton(this);
    m_btnAppendRow->setText("追加行");
    m_btnAppendRow->setIcon(style()->standardIcon(QStyle::SP_FileIcon));

    m_btnRemoveRow = new QToolButton(this);
    m_btnRemoveRow->setText("删除行");
    m_btnRemoveRow->setIcon(style()->standardIcon(QStyle::SP_TrashIcon));

    m_btnRefreshIcon = new QToolButton(this);
    m_btnRefreshIcon->setText("刷新图标");
    m_btnRefreshIcon->setIcon(style()->standardIcon(QStyle::SP_BrowserReload));

    // 让按钮同时显示图标和文字（图标在左，文字在右）
    m_btnAppendColumn->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
    m_btnRemoveColumn->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
    m_btnAppendRow   ->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
    m_btnRemoveRow   ->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
    m_btnRefreshIcon ->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);

    // 4. 工具栏
    m_toolBar = new QToolBar(this);
    m_toolBar->addWidget(m_btnAppendColumn);
    m_toolBar->addWidget(m_btnRemoveColumn);
    m_toolBar->addSeparator();
    m_toolBar->addWidget(m_btnAppendRow);
    m_toolBar->addWidget(m_btnRemoveRow);
    m_toolBar->addSeparator();
    m_toolBar->addWidget(m_btnRefreshIcon);

    // 5. 布局
    QVBoxLayout *lay = new QVBoxLayout(this);
    lay->setContentsMargins(0, 0, 0, 0);
    lay->addWidget(m_toolBar);
    lay->addWidget(m_tableView);
    setLayout(lay);
}
// void MainWidget::initModel()
// {
//     qDebug() << "initModel() called";  // 添加调试输出
//     // 表头
//     m_model->setHorizontalHeaderLabels(
//         QStringList() << "序号" << "文件名" << "文档类型"
//                       << "大小" << "更新时间");
//     qDebug() << "Headers set, column count:" << m_model->columnCount();  // 调试输出
//     // 演示数据
//     auto addRow = [&](const QString &no, const QString &name,
//                       const QString &type, const QString &size,
//                       const QString &date) {
//         QVector<CustomTableItem> row;
//         row << CustomTableItem(no)
//             << CustomTableItem(name, style()->standardIcon(QStyle::SP_FileIcon))
//             << CustomTableItem(type)
//             << CustomTableItem(size)
//             << CustomTableItem(date);
//         m_model->appendRow(row);
//         qDebug() << "Row added:" << no << name;  // 调试输出
//     };

//     addRow("1", "安装指南", "markdown", "2M",  "2024-09-21");
//     addRow("2", "说明文档", "doc",    "158KB","2024-09-21");
//     addRow("3", "设计文档", "pdf",    "3M",   "2024-09-21");

//     // 关键：给第 2 列挂下拉框代理
//     m_tableView->setItemDelegateForColumn(2,new DocumentTypeDelegate(this));
//     qDebug() << "initModel() completed, total rows:" << m_model->rowCount();  // 调试输出
// }


void MainWidget::initModel()
{
    qDebug() << "Starting initModel()";

    // 表头
    QStringList headers = QStringList() << "序号" << "文件名" << "文档类型" << "大小" << "更新时间";
    m_model->setHorizontalHeaderLabels(headers);
    qDebug() << "Headers set:" << headers;

    // 演示数据
    auto addRow = [&](const QString &no, const QString &name,
                      const QString &type, const QString &size,
                      const QString &date) {
        QVector<CustomTableItem> row;

        // 为不同文件类型使用不同的图标
        QIcon fileIcon;
        if (type == "pdf") {
            fileIcon = style()->standardIcon(QStyle::SP_FileIcon);
        } else if (type == "doc") {
            fileIcon = style()->standardIcon(QStyle::SP_FileDialogDetailedView);
        } else if (type == "markdown") {
            fileIcon = style()->standardIcon(QStyle::SP_FileDialogContentsView);
        } else {
            fileIcon = style()->standardIcon(QStyle::SP_FileIcon);
        }

        row << CustomTableItem(no)
            << CustomTableItem(name, fileIcon)
            << CustomTableItem(type)
            << CustomTableItem(size)
            << CustomTableItem(date);

        m_model->appendRow(row);
        qDebug() << "Added row:" << no << name << type;
    };

    // 添加示例数据
    addRow("1", "安装指南", "markdown", "2M",  "2024-09-21");
    addRow("2", "说明文档", "doc",    "158KB","2024-09-21");
    addRow("3", "设计文档", "pdf",    "3M",   "2024-09-21");

    // 关键：给第 2 列挂下拉框代理
    m_tableView->setItemDelegateForColumn(2, new DocumentTypeDelegate(this));
    qDebug() << "Delegate set for column 2";

    // 调整列宽
    m_tableView->resizeColumnsToContents();

    qDebug() << "initModel() completed. Total rows:" << m_model->rowCount()
             << "Total columns:" << m_model->columnCount();
}

void MainWidget::connectSignals()
{
    connect(m_btnAppendColumn, &QToolButton::clicked,this, &MainWidget::onAppendColumn);
    connect(m_btnRemoveColumn, &QToolButton::clicked,this, &MainWidget::onRemoveColumn);
    connect(m_btnAppendRow, &QToolButton::clicked, this, &MainWidget::onAppendRow);
    connect(m_btnRemoveRow, &QToolButton::clicked,this, &MainWidget::onRemoveRow);
    connect(m_btnRefreshIcon, &QToolButton::clicked,this, &MainWidget::onRefreshIcon);
    // 连接表头双击信号
    connect(m_tableView->horizontalHeader(), &QHeaderView::sectionDoubleClicked,
            this, &MainWidget::onHeaderDoubleClicked);
}

void MainWidget::onAppendColumn()
{
    static int cnt = 0;
    m_model->appendColumn(QString("新列%1").arg(++cnt));
}

void MainWidget::onRemoveColumn()
{
    if (m_model->columnCount() > 0)
        m_model->removeColumn(m_model->columnCount() - 1);
}

void MainWidget::onAppendRow()
{
    QVector<CustomTableItem> row;
    for (int c = 0; c < m_model->columnCount(); ++c)
        row << CustomTableItem(QString("新数据%1").arg(c + 1));
    m_model->appendRow(row);
}

void MainWidget::onRemoveRow()
{
    if (m_model->rowCount() > 0)
        m_model->removeRow(m_model->rowCount() - 1);
}

void MainWidget::onRefreshIcon()
{
    for (int r = 0; r < m_model->rowCount(); ++r) {
        CustomTableItem it = m_model->item(r, 0);
        // 交替用两个系统图标
        it.icon = r % 2 ?
                      style()->standardIcon(QStyle::SP_DialogYesButton) :
                      style()->standardIcon(QStyle::SP_DialogNoButton);
        m_model->setItem(r, 0, it);
    }
}

void MainWidget::onHeaderDoubleClicked(int logicalIndex)
{
    QString oldText = m_model->headerData(logicalIndex, Qt::Horizontal).toString();
    // 弹出输入对话框让用户输入新文本
    bool ok;
    QString newText = QInputDialog::getText(this,  "编辑表头","请输入新的表头文本:", QLineEdit::Normal,oldText,&ok);
    // 如果用户点击了确定并且输入不为空
    if (ok && !newText.isEmpty()) {
        // 调用模型的setHeaderData方法更新表头
        bool success = m_model->setHeaderData(logicalIndex, Qt::Horizontal, newText);
        if (!success) {
            QMessageBox::warning(this, "错误", "表头更新失败！");
        }
    }
}


